// src/cli_bbs.rs
//use chrono::Utc;
use crate::blockchain::Blockchain;
use crate::bbs::gitee_sync::GiteeManualSync;
use crate::bbs::post::BbsPost;
use crate::bbs::comment::BbsComment;
use crate::transaction::Transaction; // 新增导入
use sha2::{Sha256, Digest};
use hex;
//use sha2::Digest; // 只保留需要的 Digest trait
use crate::transaction_bbs::BbsTransaction;  // 修正路径
use anyhow::{Context, Result};

pub fn handle_submit_post(
    blockchain: &mut Blockchain,
    content_path: &str, 
    author: &str
) -> anyhow::Result<()> {
    // 1. 读取文件内容
    let content = std::fs::read_to_string(content_path)
        //.unwrap();//_or_else(|_| panic!("无法读取文件: {}", content_path));
        .context("无法读取帖子内容")?;

    // 新增内容解析（第5行开始）
    let mut lines = content.lines();
    let title = lines.next().unwrap_or_default().to_string();
    let url = lines.next().unwrap_or_default().to_string();

    // 添加调试输出
    println!("DEBUG -> 解析到URL: {}", url); // ▲▲▲ 新增调试语句

    // 读取内容后添加：
//    let post_content = content; // 保留内容副本
    let content_hash = {
        let mut hasher = Sha256::new();
        hasher.update(content.as_bytes()); // ✅ 直接使用原 content
        hex::encode(hasher.finalize())
    };

    // 2. 创建帖子对象
//    let post = BbsPost::new(
//        content_path.to_string(),
//        content,
//        author.to_string()
//    );

    let post = BbsPost::new(
        title, //"自动生成标题".to_string(),
        content.clone(),
        author.to_string()
    ).with_url(url); // 追加url

    // 提取模板需要的数据
    let template_title = post.title.clone();
    let template_url = post.url.clone();

    // 创建交易（移动post）
    let tx = BbsTransaction::Post(post);


/*    // 2. 生成内容哈希（仅基于内容本身）
    let content_hash = {
        let mut hasher = Sha256::new();
        hasher.update(content.as_bytes());
        hex::encode(hasher.finalize())
    };
*/
    // 3. 创建区块链交易
/*    let mut tx = Transaction::BbsPost {
        author: author.to_string(),
        // content_hash: content_hash.clone(), // 使用新生成的哈希
	// content_hash,
        content_hash: content_hash.clone(),
        proof: String::new(), // 后续可填入Gitee Issue URL
        signature: Vec::new(), // 签名功能待实现
        hash: String::new(), // 初始化空值
    };
    tx.calculate_hash(); // 计算交易哈希
*/
    // 生成模板文件
    // let template = GiteeManualSync::generate_template(&post);
    // let template = GiteeManualSync::generate_template(&content_hash, author);


    let template = GiteeManualSync::generate_template(
        &template_title,
        &template_url,
        //&post.title,   // 新增参数
        //&post.url,     // 新增参数
        &content_hash,
        author
    );

    // （修改部分开始 ▼▼▼）
    let template_path = "post_template.txt";
    if let Err(e) = std::fs::remove_file(template_path) {
        if e.kind() != std::io::ErrorKind::NotFound {
            return Err(e).context("无法清理旧模板文件");
        }
    }

    std::fs::write("post_template.txt", template)
	//.unwrap();
	.context("无法写入帖子模板文件")?;
    
    
    // 创建帖子交易（新增）
/*    let tx = BbsTransaction::Post(post);
    let tx_path = format!("pending_posts/{}.json", hex::encode(&tx.hash()));
    std::fs::write(tx_path, serde_json::to_string(&tx)?)?;
*/
    // 直接创建 BBS 交易
/*    let tx = BbsTransaction::Post(BbsPost {
        content: content.clone(),
        content_hash: content_hash.clone().into_bytes(), // 转换为Vec<u8>
        author: author.to_string(),
    });    
*/
/*    let post = BbsPost {
        content,
        content_hash: content_hash.clone().into_bytes(),
        author: author.to_string(),
    };
*/
/*    let post = BbsPost::new(
//        extract_title(&content), // 从内容提取标题
	// 自动生成标题（示例：取前20字符）
	content.chars().take(20).collect::<String>(),
        content,
        author.to_string()
    );
*/
/*    let post = BbsPost { 
        content: content.clone(), // ✅ 克隆内容
        content_hash: content_hash.clone().into_bytes(),
        author: author.to_string(),
        // 补充缺失字段
        title: "自动生成标题".to_string(),
        timestamp: Utc::now().timestamp()
    };

    let post = BbsPost::new(
        title, //"自动生成标题".to_string(),
        content.clone(),
        author.to_string()
    ).with_url(url); // 追加url
    let tx = BbsTransaction::Post(post);
*/
//    println!("✅ 提交模板已生成: post_template.txt");

/*    // 创建评论交易
    let tx = BbsTransaction::new_comment(&comment);
    
    // 保存到内存池
    let tx_path = format!("pending_comments/{}.json", hex::encode(&tx.hash));
    std::fs::write(tx_path, serde_json::to_string(&tx).unwrap());
*/    
    // 转换为统一交易类型
    let generic_tx: Transaction = tx.clone().into();

    // 4. 添加到区块链
    let mut chain = Blockchain::load("blockchain.json")?;
    chain.add_transaction(generic_tx); //tx.into());
    chain.save("blockchain.json")?;

//    println!("✅ 评论交易已暂存，等待矿工打包");

    println!("✅ 帖子交易已上链，等待区块打包");
    println!("👉 请将以下内容提交到Gitee Issue:");
    println!("文件路径: post_template.txt");
    println!("内容哈希: {}", content_hash);

    // 修改交易添加方式
    //let tx = BbsTransaction::Post(post.clone());
    blockchain.add_bbs_transaction(tx)?;

    Ok(())
/*    // 3. 生成内容哈希
    let content_hash = {
        let mut hasher = Sha256::new();
        hasher.update(&post.content);
	hasher.finalize().to_vec()
    };

    // 存储哈希到帖子对象
    post.content_hash = content_hash.clone();

    // 4. 生成模板文件
    let template = format!(
        "--- MOCHAIN BBS 提交模板 ---\n\
        标题: {}\n\
        作者: {}\n\
        内容哈希: {}\n\
        --------------------------\n{}",
        post.title, post.author, content_hash, post.content
    );

    std::fs::write("post_template.txt", template)
        .expect("模板文件写入失败");

    println!("✅ 请手动提交以下内容到 Gitee：");
    println!("1. 创建新 Issue 并粘贴 post_template.txt 内容");
    println!("2. 记录返回的 Issue URL");
*/
}

// src/cli_bbs.rs 新增命令
//pub fn verify_post(post_path: &str) {
//    let post = load_post(post_path);
//    let is_valid = blockchain.verify_hash(&post);
//    println!("内容有效性: {}", is_valid);
//}

// src/cli_bbs.rs 验证函数
#[allow(dead_code)]  // 待实现内容验证命令时启用
pub fn verify_comment(
    blockchain: &Blockchain,
    tx_hash: &str,
    content_path: &str
) -> Result<()> {
    let content = std::fs::read_to_string(content_path)
        .context("无法读取验证内容")?;
    
    let stored_hash = blockchain
        .get_tx_hash(tx_hash)
        .context("找不到链上交易")?;
    
    let current_hash = {
        let mut hasher = Sha256::new();
        hasher.update(&content);
        hex::encode(hasher.finalize())
    };
    
    if stored_hash == current_hash {
        println!("✅ 内容完整性验证通过");
    } else {
        println!("❌ 内容已被篡改！");
    }
    
    Ok(())
}

// src/cli_bbs.rs
pub fn handle_submit_comment(
    blockchain: &mut Blockchain,  // 添加区块链参数 // 改为可变引用
    post_hash: &str, 
    content_path: &str, 
    author: &str
) -> anyhow::Result<()> 
{
    let content = std::fs::read_to_string(content_path)
        //.expect("无法读取评论内容文件");
        .context("无法读取评论内容文件")?;

    // ▼▼▼ 新增解析逻辑 ▼▼▼
    let (url, content) = content.split_once('\n')
        .ok_or_else(|| anyhow::anyhow!("评论文件格式错误"))?;
    
/*    let comment = BbsComment::new(
        post_hash.to_string(),
        content,
        author.to_string()
    );
*/
    let comment = BbsComment::new(
        post_hash.to_string(),
        content.to_string(),
        author.to_string()
    ).with_url(url.trim().to_string()); // 添加URL
    
/*    let template = format!(
        "--- MOCHAIN 评论模板 ---\n\
        关联帖子哈希: {}\n\
        作者: {}\n\
        内容哈希: {}\n\
        -----------------------\n{}",
        post_hash,
        author,
        hex::encode(&comment.content_hash),
        comment.content
    );
*/
    let template = GiteeManualSync::generate_comment_template(&comment);
    
    std::fs::write("comment_template.txt", template)
        //.expect("评论模板写入失败");
        .context("评论模板写入失败")?;
    
    println!("✅ 评论模板已生成: comment_template.txt");

    // 创建并保存交易
    let tx = BbsTransaction::Comment(comment);
    blockchain.add_bbs_transaction(tx)?;

    // 显式保存修改后的区块链
    // blockchain.save()?;

    Ok(())
}
